home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / thrust-s.53 / thrust-s / thrust / src / level.c < prev    next >
C/C++ Source or Header  |  1995-10-13  |  8KB  |  357 lines

  1.  
  2. /* Written by Peter Ekberg, peda@lysator.liu.se */
  3.  
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include "thrust.h"
  8.  
  9. int
  10. matchsliders(void)
  11. {
  12.   int i,j;
  13.   int match,dist;
  14.  
  15. /*
  16.   for(i=0; i<nrsliders; i++) {
  17.     printf("Slider %d:\n", i);
  18.     printf("\tx=%4d\ty=%4d\tdir=%d\tmatch=%d\ttype=%2d\n",
  19.        sliders[i].x1,
  20.        sliders[i].y1,
  21.        sliders[i].dir,
  22.        sliders[i].match,
  23.        sliders[i].type);
  24.   }
  25. */
  26.   for(i=0; i<nrsliders; i++) {
  27.     if(!sliders[i].match && sliders[i].dir) {
  28.       match=nrsliders;
  29.       dist=lenx;
  30.       for(j=0; j<nrsliders; j++) {
  31.     if(!sliders[j].match && !sliders[j].dir
  32.        && ((sliders[i].type-1)/3==(sliders[j].type-1)/3)) {
  33.       switch(sliders[i].dir) {
  34.       case 1:
  35.         if(sliders[j].type!=12) {
  36.           if((sliders[i].y1 == sliders[j].y1)
  37.          && (sliders[j].x1>sliders[i].x1)
  38.          && (sliders[j].x1-sliders[i].x1 < dist)) {
  39.         dist=sliders[j].x1-sliders[i].x1;
  40.         match=j;
  41.           }
  42.         }
  43.         else
  44.           if((sliders[i].x1 == sliders[j].x1)
  45.          && (sliders[j].y1>sliders[i].y1)
  46.          && (sliders[j].y1-sliders[i].y1 < dist)) {
  47.         dist=sliders[j].y1-sliders[i].y1;
  48.         match=j;
  49.           }          
  50.         break;
  51.       case 2:
  52.         if(sliders[j].type!=12) {
  53.           if((sliders[i].y1 == sliders[j].y1)
  54.          && (sliders[i].x1>sliders[j].x1)
  55.          && (sliders[i].x1-sliders[j].x1 < dist)) {
  56.         dist=sliders[i].x1-sliders[j].x1;
  57.         match=j;
  58.           }
  59.         }
  60.         else
  61.           if((sliders[i].x1 == sliders[j].x1)
  62.          && (sliders[i].y1>sliders[j].y1)
  63.          && (sliders[i].y1-sliders[j].y1 < dist)) {
  64.         dist=sliders[i].y1-sliders[j].y1;
  65.         match=j;
  66.           }
  67.         break;
  68.       }
  69.     }
  70.       }
  71.       if(match==nrsliders) {
  72.     printf("Found slider with no blocker.\n");
  73.     return(0);
  74.       }
  75.       sliders[i].match=1;
  76.       sliders[match].match=1;
  77.       sliders[i].x2=sliders[match].x1;
  78.       sliders[i].y2=sliders[match].y1;
  79.       j=closestbutton((sliders[i].x1+sliders[i].x2)>>1,
  80.               (sliders[i].y1+sliders[i].y2)>>1);
  81.       if(j<0) {
  82.     printf("Found no botton to connect the slider with.\n");
  83.     return(0);
  84.       }
  85.       j=majorbutton(j);
  86.       sliders[i].next=((buttondata *)things[j].data)->sliders;
  87.       ((buttondata *)things[j].data)->sliders=&sliders[i];
  88.     }
  89.   }
  90. /*
  91.   {
  92.     slider *s;
  93.     int i;
  94.     int j=0;
  95.     printf("Sliders:\n");
  96.     for(i=0; i<nrthings; i++) {
  97.       if(things[i].type==7 || things[i].type==8) {
  98.     printf("Button:%d\n", ++j);
  99.     s=((buttondata *)things[i].data)->sliders;
  100.     while(s) {
  101.       printf("\tx1=%4d\ty1=%4d\tx2=%4d\ty2=%4d\tdir=%d\t"
  102.          "match=%d\ttype=%2d\n",
  103.          s->x1,
  104.          s->y1,
  105.          s->x2,
  106.          s->y2,
  107.          s->dir,
  108.          s->match,
  109.          s->type);
  110.       s=s->next;
  111.     }
  112.       }
  113.     }
  114.   }
  115. */    
  116.   return(1);
  117. }
  118.  
  119. int
  120. ismajorbutton(int tag)
  121. {
  122.   int i;
  123.  
  124.   for(i=0; i<nrthings; i++)
  125.     if((things[i].type==7 || things[i].type==8)
  126.       && (((buttondata *)things[i].data)->tag==tag))
  127.     return(i);
  128.   return(-1);
  129. }
  130.  
  131. void
  132. releasebana(void)
  133. {
  134.   int i;
  135.  
  136.   for(i=0; i<nrthings; i++)
  137.     if(things[i].data)
  138.       free(things[i].data);
  139.   nrthings=0;
  140.   nrsliders=0;
  141.   nrbarriers=0;
  142.   nrrestartpoints=0;
  143. }
  144.  
  145. int
  146. readbana(char **ptr)
  147.      /* LΣser in banan i variablen 'bana'.
  148.      // Filen startar med fem vΣrden, t.ex
  149.      // 123
  150.      // 69
  151.      // 8
  152.      // 10
  153.      // 16
  154.      // Dessa fem tal innebΣr f÷ljande:
  155.      // Banan Σr 123 tecken bred (lenx) och 69 tecken
  156.      // h÷g (leny). Den b÷rjar med 8 rader med stjΣrnor och
  157.      // dΣrefter f÷ljer 10 tomrader.
  158.      // Banan slutar med 16 rader med ifyllda block.
  159.      // Efter dessa tal kommer banans definition som
  160.      // placeras mellan tomraderna och de ifyllda blocken. */
  161. {
  162.   int stat=1;
  163.   word t1,t2,x,y,z;
  164.   word sx,sy,sz;
  165.   byte *temp;
  166.   buttondata *bdata;
  167.  
  168.   releasebana();
  169.  
  170.   spacestation=0;
  171.   lenx=atoi(ptr[0]);
  172.   if(lenx%BBILDX!=0)
  173.     stat=0;
  174.   lenx3=lenx<<3;
  175.   leny=atoi(ptr[1]);
  176.   sx=atoi(ptr[2]);
  177.   for(sy=0; sy<3; sy++)
  178.     if(sx<2*BBILDY) {
  179.       sx+=BBILDY-(leny%BBILDY);
  180.       leny+=BBILDY-(leny%BBILDY);
  181.     }
  182.   leny3=leny<<3;
  183.   if(lenx*(long)leny>(long)maxlenx*maxleny)
  184.     stat=0;
  185.   sy=atoi(ptr[3]);
  186.   sz=atoi(ptr[4]);
  187.   x=y=lenx*(sx-2*BBILDY);
  188.   colorr=atoi(ptr[5]);
  189.   colorg=atoi(ptr[6]);
  190.   colorb=atoi(ptr[7]);
  191.   if(stat) {
  192.     memset(bana,32,lenx*(sx+sy));
  193.     x>>=6;
  194.     for(z=0; z<BBILDY; z++) {
  195.       t1=random()%(BBILDY*lenx);
  196.       t2=random()%16;
  197.       *(bana+t1)=t2;
  198.       *(bana+t1+BBILDY*lenx)=t2;
  199.     }
  200.     for(; x; x--)
  201.       *(bana+2*BBILDY*lenx+(random()%y))=random()%16;
  202.     for(y=sx+sy; y<leny-sz && stat; y++) {
  203.       temp=ptr[y-sx-sy+8];
  204.       for(x=0; x<lenx && stat; x++) {
  205.     switch(temp[x]) {
  206.     case 'a':
  207.       if(nrbarriers<maxbarriers) {
  208.         barriers[nrbarriers].x=x;
  209.         barriers[nrbarriers++].y=y;
  210.       }
  211.       else
  212.         stat=0;
  213.       break;
  214.     case 'b':
  215.       if(nrrestartpoints<maxrestartpoints) {
  216.         restartpoints[nrrestartpoints].x=x;
  217.         restartpoints[nrrestartpoints++].y=y;
  218.       }
  219.       else
  220.         stat=0;
  221.       break;
  222.     case 176:       /* Slide \block to the right */
  223.     case 177:       /* Slide \block to the left */
  224.     case 178:       /* Horizontal \blocker */
  225.     case 179:       /* Slide /block to the right */
  226.     case 180:       /* Slide /block to the left */
  227.     case 181:       /* Horizontal /blocker */
  228.     case 182:       /* Slide |block to the right */
  229.     case 183:       /* Slide |block to the left */
  230.     case 184:       /* Horizontal |blocker */
  231.     case 185:       /* Slide -block downwards */
  232.     case 186:       /* Slide -block upwards */
  233.     case 187:       /* Vertical -blocker */
  234.       if(nrsliders<maxsliders)
  235.         newslider(x,y,temp[x]-175);
  236.       else
  237.         stat=0;
  238.       break;
  239.     case 188:       /* Button on left wall */
  240.       if(nrthings<maxthings) {
  241.         bdata=malloc(sizeof(buttondata));
  242.         if(!bdata) {
  243.           printf("Out of memory.\n");
  244.           stat=0;
  245.         }
  246.         else {
  247.           bdata->sliders=NULL;
  248.           bdata->tag=temp[x-1];
  249.           bdata->major=ismajorbutton(bdata->tag);
  250.           newthing((x<<3)+9,(y<<3)+8,x,y,7,bdata);
  251.         }
  252.       }
  253.       else
  254.         stat=0;
  255.       break;
  256.     case 190:       /* Button on right wall */
  257.       if(nrthings<maxthings) {
  258.         bdata=malloc(sizeof(buttondata));
  259.         if(!bdata) {
  260.           printf("Out of memory.\n");
  261.           stat=0;
  262.         }
  263.         else {
  264.           bdata->sliders=NULL;
  265.           bdata->tag=temp[x-1];
  266.           bdata->major=ismajorbutton(bdata->tag);
  267.           newthing((x<<3)-1,(y<<3)+8,x,y,8,bdata);
  268.         }
  269.       }
  270.       else
  271.         stat=0;
  272.       break;
  273.     case 192:       /*  |\x Bunker */
  274.       if(nrthings<maxthings)
  275.         newthing((x<<3)+14,(y<<3)+8,x,y,3,NULL);
  276.       else
  277.         stat=0;
  278.       break;
  279.     case 197:       /*  x/| Bunker */
  280.       if(nrthings<maxthings)
  281.         newthing((x<<3)+10,(y<<3)+8,x,y,4,NULL);
  282.       else
  283.         stat=0;
  284.       break;
  285.     case 203:       /*  |/x Bunker */
  286.       if(nrthings<maxthings)
  287.         newthing((x<<3)-2,(y<<3)+8,x-2,y,5,NULL);
  288.       else
  289.         stat=0;
  290.       break;
  291.     case 204:    /*  x\| Bunker */
  292.       if(nrthings<maxthings)
  293.         newthing((x<<3)+10,(y<<3)+7,x,y,6,NULL);
  294.       else
  295.         stat=0;
  296.       break;
  297.     case 240:    /* Fuel */
  298.       if(nrthings<maxthings)
  299.         newthing((x<<3)+8,(y<<3)+8,x,y,1,NULL);
  300.       else
  301.         stat=0;
  302.       break;
  303.     case 244:    /* Spacestation */
  304.       if(nrthings<maxthings && !spacestation) {
  305.         spacestation=1;
  306.         ssblip=1;
  307.         ssx=x+2;
  308.         ssy=y;
  309.         newthing((x<<3)+12,(y<<3)+9,x,y,2,NULL);
  310.       }
  311.       else
  312.         stat=0;
  313.       break;
  314.     case 253:
  315.       loadbx=x;
  316.       loadby=y;
  317.       break;
  318.     }
  319.     if(!stat)
  320.       printf("Unable to create a thing.\n");
  321.       }
  322.       memcpy(bana+(long)y*lenx,temp,lenx);
  323.     }
  324.     memset(bana+(long)y*lenx,224,lenx*sz);
  325.   }
  326.  
  327.   if(stat) {
  328.     for(x=0; x<nrthings; x++) {
  329.       if(things[x].type==7)
  330.     *(bana+(long)things[x].py*lenx+things[x].px-1)=224;
  331.       if(things[x].type==8)
  332.     *(bana+(long)things[x].py*lenx+things[x].px-1)=32;
  333.     }
  334.     for(x=0; x<nrsliders; x++)
  335.       *(bana+(long)sliders[x].y1*lenx+sliders[x].x1)=224;
  336.     if(!matchsliders()) {
  337.       printf("Unable to match all sliders.\n");
  338.       stat=0;
  339.     }
  340.     if(nrrestartpoints && !nrbarriers) {
  341.       printf("No restartpoint for the barriers.\n");
  342.       stat=0;
  343.     }
  344.     for(x=0; x<nrbarriers; x++) {
  345.       barriers[x].restart=&restartpoints[0];
  346.       for(y=1; y<nrrestartpoints; y++)
  347.     if((abs(barriers[x].x-restartpoints[y].x)
  348.         + abs(barriers[x].y-restartpoints[y].y))
  349.        < (abs(barriers[x].x-barriers[x].restart->x)
  350.           + abs(barriers[x].y-barriers[x].restart->y)))
  351.       barriers[x].restart=&restartpoints[y];
  352.     }
  353.   }
  354.  
  355.   return(stat);
  356. }
  357.